package org.example;

import com.alibaba.excel.EasyExcel;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import io.github.bonigarcia.wdm.WebDriverManager;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

public class DynamicNewsCrawler {

    public static void main(String[] args) {
        WebDriverManager.chromedriver().setup();

        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless");  // 无头模式，不显示浏览器界面
        options.addArguments("--disable-gpu"); // 禁用 GPU 加速
        options.addArguments("--no-sandbox");  // 解决某些环境下的权限问题
        options.addArguments("start-maximized");  // 最大化窗口
        options.addArguments("disable-infobars"); // 禁用信息条
        options.addArguments("--disable-extensions"); // 禁用扩展
        options.addArguments("--disable-dev-shm-usage"); // 解决在某些环境中的问题
        options.addArguments("disable-images"); // 禁止图片加载

        WebDriver driver = new ChromeDriver(options);
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(30));

        try {
            String url = "https://www.cnstock.com/searchResult";
            driver.get(url);

            // 等待页面完全加载
            wait.until(webDriver -> ((JavascriptExecutor) webDriver)
                    .executeScript("return document.readyState").equals("complete"));

            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("p")));

            // 搜索框
            WebElement searchInput = wait.until(ExpectedConditions.presenceOfElementLocated(
                    By.cssSelector("input.ant-input.ant-input-lg")
            ));
            searchInput.sendKeys("比亚迪");

            // 搜索按钮
            WebElement searchButton = wait.until(ExpectedConditions.elementToBeClickable(
                    By.cssSelector("button.ant-btn.ant-btn-primary.ant-btn-lg.ant-input-search-button")
            ));
            searchButton.click();

            // 获取网页 body 元素，后续用于模拟滚动
            WebElement body = driver.findElement(By.tagName("body"));

            // 记录开始时间
            long startTime = System.currentTimeMillis();
            int lastCount = 0;

            // 持续滚动，直到 30 秒 或者 没有新数据
            while (System.currentTimeMillis() - startTime < 20000) {
                // 滚动到页面底部
                ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");

                // 等待新内容加载
                Thread.sleep(2000); // 适当调整等待时间

                // 重新获取新闻列表
                List<WebElement> newNewsList = driver.findElements(By.xpath("//a[contains(@class, 'index_itemWrapper')]"));

                // 判断是否有新内容加载
                if (newNewsList.size() == lastCount) {
                    break; // 如果没有新内容加载，则停止滚动
                }
                lastCount = newNewsList.size();
            }

            // 获取最终的新闻列表
            List<WebElement> finalNewsList = driver.findElements(By.xpath("//a[contains(@class, 'index_itemWrapper')]"));
            List<NewsData> dataList = new ArrayList<>();


            // 打印所有新闻标题
            for (WebElement news : finalNewsList) {
                try {
                    String fullText = news.getText();
                    String link = news.getAttribute("href");

                    // 提取标题（第一行）
                    String[] lines = fullText.split("\n");
                    String title = lines[0];

                    // 提取时间（通常在最后一行）
                    String time = lines[lines.length - 1];

                    dataList.add(new NewsData(title, time, link));
                } catch (Exception e) {
                    System.out.println("无法获取标题！");
                }
            }

            // 5. 写入 Excel
            String filePath = "新闻数据.xlsx";
            EasyExcel.write(filePath, NewsData.class).sheet("新闻列表").doWrite(dataList);

            System.out.println("数据已写入 Excel：" + filePath);

        } catch (TimeoutException e) {
            System.out.println("超时：页面加载可能太慢或元素未找到！");
        } catch (NoSuchElementException e) {
            System.out.println("错误：找不到指定元素！");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }


    }
}
